/*************************************************************************
    > File Name    : LRUCache.h
    > Author       : LiuLei
    > Mail         : 2261459486@qq.com 
    > Created Time : 2022年11月30日 星期三 14时10分10秒
 ************************************************************************/

#ifndef __LL_LRUCACHE_H__
#define __LL_LRUCACHE_H__

#include <string>
#include <unordered_map>
#include <list>
using std::string;
using std::unordered_map;
using std::list;
using std::pair;

class LRUCache
{
    using ElemType = string;

public:
    LRUCache(int capacity);                                      // 初始化 LRU 缓存的容量
    ~LRUCache();

    void addElement(const string &key, const ElemType &value);  // 往缓存中添加元素
    void readFromFile(const string &filename);                  
    // 从文件中读取数据一般用于系统启动的时候从缓存中读取之前保存的持久化数据

    void writeToFile(const string &filename);                   // 将缓存中的信息写入文件

private:
    size_t                                                          _capacity;  // 容量

    unordered_map<string, list<pair<string, ElemType>>::iterator>   _hashMap;
    // 用于查找 LRUCache 中是否存在该数据 <关键字，迭代器::<关键字，网页数据>>

    list<pair<string, ElemType>>                                    _resultList;
    list<pair<string, ElemType>>                                    _pendingUpdateList;
    // 用于实现 LRU 内部逻辑的链表 <关键字，网页数据>
    // 其中越靠近 “链表头” 表示数据越新，越靠近 “链表尾” 表示数据越旧
};

#endif
